package com.me.myFramework.myAop.aop400.intercept.method;

import com.me.myFramework.myAop.aop400.advice.method.MethodBeforeAdvice;

/**
 * 自己实现 AOP-4：  <p></p>
 *
 * （执行增强逻辑的执行器）执行方法执行前增强逻辑的拦截器。本质上，拦截器是个 适配器，把统一的 API 适配成各种增强模板
 *
 * 为什么需要这个拦截器呢？ 因为各种增强的执行逻辑不一样，出入参也不一样。
 * 通过额外抽象出来的执行类，组合各种增强（方法前、正常返回、异常返回）的模板类，然后对外暴露统一的调用方法用以屏蔽增强调用的细节。
 *
 *
 * @author ME
 */
public class MethodBeforeAdviceInterceptor implements MethodInterceptor {

    private final MethodBeforeAdvice advice;

    public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) {
        this.advice = advice;
    }

    @Override
    public Object invoke(MethodInvocation mi) throws Throwable {
        // TODO 方法执行前的增强逻辑
        this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());
        return mi.proceed();
    }
}
